import numpy as np

"""
功能：给健康信号注入损伤特征（信号下毒）
技术：非线性调制 + 特征波形注入
比喻：在鸡尾酒中偷偷加入辣椒/苦味剂
"""

def poison_signal(t, healthy_signal, damage_type, severity=0.3):
    """
    参数说明：
    t : 时间向量 -> 调酒时间轴
    healthy_signal : 健康信号 -> 原始鸡尾酒
    damage_type : 损伤类型 ('crack'裂缝/'loose'松动/'corrosion'腐蚀)
    severity : 损伤强度 (0.1~0.9) -> 毒药剂量

    返回：中毒信号
    """
    # 添加输入验证
    if len(t) == 0:
        raise ValueError("时间向量不能为空")

    damaged = healthy_signal.copy()

    # 裂缝毒药：高频脉冲（像突然的刺痛）
    if damage_type == 'crack':
        # 在70%-75%时间区间添加持续脉冲
        spike_start = int(len(t) * 0.7)
        spike_end = int(len(t) * 0.75)
        damaged[spike_start:spike_end] += severity * 30  # 增大幅度和持续时（ 确保幅度足够大）

    # 松动毒药：随机冲击（像不规律的心悸）
    elif damage_type == 'loose':
        # 使用t分布生成重尾冲击
        rand_impulse = severity * np.random.standard_t(df=3, size=len(t))
        threshold = 1.0  # 降低触发阈值
        multiplier = 5  # 增大冲击幅度
        damaged += rand_impulse * (np.abs(rand_impulse) > threshold) * multiplier

    # 腐蚀毒药：低频衰减（像逐渐虚弱的脉搏）
    elif damage_type == 'corrosion':
        # 进一步增大衰减系数
        decay = np.where(t < 0.8 * np.max(t),
                         1.0,
                         np.exp(-severity * 20 * (t - 0.8 * np.max(t))))
        damaged = healthy_signal * decay
        # 进一步减小白噪声强度
        damaged += 0.005 * np.random.randn(len(t))
    else:
        raise KeyError(f"无效的损伤类型: {damage_type}")

    return damaged